#!/bin/bash
# CentOS 7 环境准备脚本
# 功能：系统更新、工具安装、防火墙和SELinux配置

set -Eeuo pipefail

# 日志函数
log() { echo -e "$(date +'%F %T') | $*"; }
warn() { echo -e "$(date +'%F %T') | WARNING: $*" >&2; }
err() { echo -e "$(date +'%F %T') | ERROR: $*" >&2; }
trap 'err "脚本出错（行号: $LINENO）"' ERR

log "=========================================="
log "CentOS 7 环境准备开始"
log "=========================================="

# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then 
    err "请使用 root 用户运行此脚本"
    exit 1
fi

# 1. 配置国内 yum 镜像源（阿里云）
log "[1/7] 配置国内 yum 镜像源..."
if [ ! -f /etc/yum.repos.d/CentOS-Base.repo.backup ]; then
    # 备份原有源
    cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2>/dev/null || true
    
    # 使用阿里云镜像源
    cat > /etc/yum.repos.d/CentOS-Base.repo <<'EOF'
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
EOF
    log "✓ 已配置阿里云 yum 镜像源"
else
    log "✓ yum 镜像源已配置，跳过"
fi

# 清理并更新 yum 缓存
yum clean all
yum makecache

# 2. 系统更新
log "[2/7] 更新系统包..."
yum update -y

# 3. 安装必要工具
log "[3/7] 安装必要工具..."
yum install -y vim wget curl net-tools git yum-utils device-mapper-persistent-data lvm2
log "✓ 必要工具安装完成"

# 4. 系统资源检查
log "[4/7] 检查系统资源..."
log "--- 内存信息 ---"
free -h
log "--- 磁盘空间 ---"
df -h
log "--- CPU 信息 ---"
lscpu | grep -E "^CPU\(s\)|^Thread|^Core"

# 检查资源是否足够
TOTAL_MEM=$(free -g | awk '/^Mem:/{print $2}')
AVAILABLE_DISK=$(df -h / | awk 'NR==2 {print $4}' | sed 's/G//' || echo "20")

if [ "$TOTAL_MEM" -lt 4 ]; then
    warn "内存不足 4GB (当前: ${TOTAL_MEM}GB)，建议至少 4GB 内存"
else
    log "✓ 内存充足 (${TOTAL_MEM}GB)"
fi

# 5. 配置防火墙
log "[5/7] 配置防火墙..."
systemctl start firewalld
systemctl enable firewalld

# 开放必要端口
firewall-cmd --permanent --add-service=ssh      # SSH 服务（推荐使用服务方式）
firewall-cmd --permanent --add-port=22/tcp      # SSH 端口（备用）
firewall-cmd --permanent --add-port=6443/tcp    # Kubernetes API (k3s)
firewall-cmd --permanent --add-port=10250/tcp   # Kubelet (k3s)
firewall-cmd --permanent --add-port=8472/udp    # Flannel VXLAN (k3s CNI 网络)
firewall-cmd --permanent --add-port=30000-32767/tcp  # NodePort 范围
firewall-cmd --permanent --add-port=2379-2380/tcp   # etcd (如果使用外部 etcd)
firewall-cmd --permanent --add-port=10259/tcp    # kube-scheduler
firewall-cmd --permanent --add-port=10257/tcp    # kube-controller-manager

# 允许 ICMP（ping）
firewall-cmd --permanent --add-icmp-block-inversion

firewall-cmd --reload

log "✓ 防火墙规则已配置"
log "  开放端口: 22(SSH), 6443(K8s API), 10250(Kubelet), 8472(Flannel), 30000-32767(NodePort)"

# 6. 配置 SELinux
log "[6/7] 配置 SELinux..."
# 设置为 permissive 模式（允许但记录违规）
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config

log "✓ SELinux 已设置为 permissive 模式"

# 7. 禁用 swap（Kubernetes 要求）
log "[7/7] 禁用 swap..."
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
log "✓ swap 已禁用"

log "=========================================="
log "CentOS 7 环境准备完成！"
log "=========================================="
log ""
log "下一步："
log "1. 运行 scripts/k8s/install-docker.sh 安装 Docker"
log "2. 或运行 scripts/k8s/setup-k8s.sh 安装 K8s(推荐)"

